#ifndef __GAF_MOVEACT_H__
#define __GAF_MOVEACT_H__

namespace GAF
{
	//struct ActionIntent;
		struct MoveIntent;
	//class Player
		//class Animation -* Runnable
			//class Action
				class MoveAction;
}
typedef GAF::MoveIntent		GAF_SMoveIntent;
typedef GAF::MoveAction		GAF_CMoveAction;

#include "GAF_Action.h"

namespace GAF
{
	/// 移动意图结构
	struct MoveIntent : ActionIntent
	{
		/// 移动是否从当前位置点开始
		bool		isHasCurPos;	// 是否包含当前位置点
		/// 移动关键路径点
		Point*		atPaths;	// 移动关键路径点
		/// 关键路径点数量
		int		nPathNum;	// 关键路径点数量

		MoveIntent()
		{
			isHasCurPos = true;
			atPaths = NULL;
			nPathNum = 0;
		}
	};

	/// 移动动作类
	class MoveAction : public Action
	{
	public:
		MoveAction();
		~MoveAction();

	public:
		/// 设置移动效果
		void		SetIntent(ActionIntent* pIntent);
		/// 快捷方式，移动到某一点
		void		MoveTo(Point at);
		/// 快捷方式，移动到某一点
		void		MoveTo(int nX, int nY);
		/// 快捷方式，再次移动
		void		MoveAgain();

		/// 移动动作更新是否依赖画面更新
		void		AtFPS(bool isAtFPS = true);
	protected:
		bool		Playing(Bundle* pbdlParam);
		bool		Running(TimeTicks ttUsed, bool& isFinish);
		bool		Stopping();

	protected:
		/// 当将要移动时
		virtual	bool	OnMoveAct()
				{return true;}

	private:
		int		Move();
		void		CreatPathLine();
		int		CreatLine(Point& atStart, Point& atEnd, Point* patLine = NULL);

	public:
		/// 速度属性
		DIM_ATTRIB(UINT, Speed);		// 单位：像素/秒
		/// 加速度属性
		DIM_ATTRIB(int, AddSpeed);		// 单位：像素/秒
		/// 最大速度属性
		DIM_ATTRIB(UINT, MaxSpeed);		// 单位：像素/秒

	private:
		MoveIntent	m_Intent;
		UINT		m_nSpeed;		// 当前速度	单位：像素/秒
// 		int		m_nGravity;		// 重力
		int		m_nTimes;		// 次数
		int		m_nWay;			// 正方向

	private:
		bool		m_isAtFPS;		// 移动是否依赖画面更新
		TimeTicks	m_ttLast;		// 上次移动时间
		float		m_fRemanent;		// 剩余部分

		bool		m_isAgain;		// 再一次

		Point*		m_atPath;		// 移动路径
		UINT		m_nPathLen;		// 路径长度
		int		m_nCur;			// 当前所在路径位置
	};
}
#endif
